/**
 * 验证码倒计时
 * @作者: 陈老师儿~
 * @手机: 18510000810
 */

import { ref, onMounted, onBeforeUnmount } from "vue";

// key: 验证码的key，用于区分不同的验证码
// seconds: 倒计时时长，单位秒，默认为10秒
// end: 倒计时结束后的回调函数，默认为 null
// change: 倒计时变化时的回调函数，默认为 null
// defaultText: 默认文本
// countdownText: 倒计时中的文本，其中 "{seconds}" 表示秒数占位符
// endText: 倒计时结束后的文本
export default function usePureCodeCountdown(config = {}) {
	// 默认配置
	const defaultConfig = {
		key: null,
		seconds: 60,
		end: null,
		change: null,
		defaultText: "发送验证码",
		countdownText: "{seconds}s",
		endText: "重新发送"
	};

	// 合并配置
	const _config = { ...defaultConfig, ...config };

	// 倒计时时长
	const _seconds = ref(_config?.seconds || 60);

	// 定时器
	let timer = null;

	// 存储缓存的key
	const keyName = _config?.key ? "PURE_CODE_COUNTDOWN_" + _config.key.toUpperCase() : null;

	// 倒计时状态
	const isCountdown = ref(false);

	// 提示文本
	const tips = ref(_config?.defaultText);

	// 组件挂载时
	onMounted(() => {
		// 查找缓存的数据
		const cacheData = findCacheData();

		// 有缓存的数据
		if (cacheData) {
			// 继续倒计时
			goon(cacheData);
		}
	});

	// 组件卸载时
	onBeforeUnmount(() => {
		// 清除定时器
		clearTimer();
	});

	// 开始
	function start() {
		// 正在倒计时
		if (isCountdown.value) return;

		// 设置定时器，开始倒计时
		setTimer();
	}

	// 设置定时器，开始倒计时
	function setTimer() {
		// 先清除一下定时器
		clearTimer();

		// 更新倒计时状态
		isCountdown.value = true;

		// 缓存数据
		setCacheData();

		// 设置定时器，开始倒计时
		timer = setInterval(() => {
			// 倒计时减1
			_seconds.value--;

			// 提示文本
			formatText();

			// 秒级回调
			if (typeof _config?.change === "function") {
				_config?.change(_seconds.value);
			}

			// 倒计时结束
			if (_seconds.value <= 0) {
				end();
				return;
			}

			// 缓存数据
			setCacheData();
		}, 1000);
	}

	// 结束
	function end() {
		// 清除定时器
		clearTimer();

		// 清除缓存数据
		clearCacheData();

		// 更新倒计时秒数
		_seconds.value = _config?.seconds || 60;

		// 更新倒计时状态
		isCountdown.value = false;

		// 更新提示文本
		tips.value = _config?.endText;

		// 调用倒计时结束回调函数
		callEndFn();
	}

	// 清除定时器
	function clearTimer() {
		if (timer) {
			clearInterval(timer);
			timer = null;
		}
	}

	// 清除
	function clear() {
		// 清除定时器
		clearTimer();

		// 清除缓存数据
		clearCacheData();

		// 更新倒计时秒数
		_seconds.value = _config?.seconds || 60;

		// 更新倒计时状态
		isCountdown.value = false;
	}

	// 查找缓存的数据
	function findCacheData() {
		if (!keyName) return null;
		return uni.getStorageSync(keyName);
	}

	// 缓存数据
	function setCacheData() {
		if (!keyName) return;
		// 缓存数据
		const storageData = {
			seconds: _seconds.value,
			timestamp: Date.now()
		};
		uni.setStorageSync(keyName, storageData);
	}

	// 清除缓存数据
	function clearCacheData() {
		// 清除缓存数据
		uni.removeStorageSync(keyName);
	}

	// 继续倒计时
	function goon(cacheData) {
		const { seconds: goonSeconds, timestamp } = cacheData;

		// 当前时间戳
		const nowTimestamp = Date.now();

		// 过去了多少秒
		const passSeconds = Math.ceil((nowTimestamp - timestamp) / 1000);

		// 还在倒计时范围内
		if (passSeconds <= goonSeconds) {
			// 更新倒计时秒数
			_seconds.value = goonSeconds - passSeconds;

			// 设置定时器，开始倒计时
			setTimer();

			return;
		}

		// 走完了
		end();
	}

	// 调用倒计时结束回调函数
	function callEndFn() {
		if (typeof _config?.end === "function") {
			_config?.end();
		}
	}

	// 格式化倒计时中的提示文本
	function formatText() {
		// 将 config.countdownText 中的 "XX" 替换为 _seconds.value
		tips.value = _config?.countdownText?.replace(/{seconds}/gi, _seconds.value);
	}

	return {
		seconds: _seconds,
		isCountdown,
		start,
		clear,
		tips
	};
}
